#include<iostream>
#include"ListData.hpp"
#include"queue"


struct BinaryTree_Node
{
  BinaryTree_Node(ListData Data);
  ~BinaryTree_Node();
  BinaryTree_Node(BinaryTree_Node* preNode);
  ListData data;
  BinaryTree_Node* leftNode;
  BinaryTree_Node* rightNode;
  //function below all implemented by recursion
  void PreOrderTraverse();
  void InOrderTraverse();
  void PostOrderTraverse();
  void LevelOrderTraverse();
  int GetDepth();
  int NodeCount();
  int LeadCount();
};


class BinaryTree
{
  public:
   BinaryTree(ListData Data);
   ~BinaryTree();
   void PreOrderTraverse();
   void InOrderTraverse();
   void PostOrderTraverse();
   void LevelOrderTraverse();
   void Insert(ListData res);
   void Delete(ListData res);
   BinaryTree(const BinaryTree &preTree);
   BinaryTree &operator=(const BinaryTree &preTree);
   int GetDepth();
   int NodeCount();
   int LeadCount();

 private:
  BinaryTree_Node* root;
};